#ifndef PRUEBASSERIALIZACION_H_
#define PRUEBASSERIALIZACION_H_

#include "../Registro.h"
#include <iostream>
#include "../Bloque.h"
#include "../ClaveDatoCuba.h"
#include "ClaveAlumno.h"
#include "../Cuba.h"
#include "../Archivo.h"

using namespace Toolkit;
using namespace std;

//void prueba1Serializacion()
//{
//    Bloque unBloque(200, TEXTO);
//
//    Registro registro(TEXTO);
//    DatoTexto miDato("hola", 10);
//
//    registro.setDato(&miDato);
//
//    ClaveDatoTexto clave(miDato);
//
//    unBloque.agregar(registro,clave);
//
//    stringstream ss;
//    //registro.serializar(ss);
//    unBloque.serializar(ss);
//
//    fstream archivo;
//    archivo.open("prueba1", ios_base::in | ios_base::out | ios_base::trunc);
//
//    archivo << ss.str(); /*Fin Serializacion*/
//
//    archivo.seekg (0, ios::beg);
//
//    stringstream ss2;
//
//    while (archivo)
//    {
//        char c;
//        archivo >> c;
//        ss2 << c;
//    }
//
//    Bloque bloqueHidratado(200, TEXTO);
//    bloqueHidratado.hidratar(ss2);
//
//    ClaveDatoTexto claveBusqueda(10);
//    bloqueHidratado.buscar(claveBusqueda);
//
//    Registro registro2(TEXTO);
//
//    DatoTexto miDato2;
//    registro2.setDato(&miDato2);
//
//
//    registro2.hidratar(ss2);
//
//    DatoTexto *datoRecuperado = (DatoTexto*) registro2.clonarDato();
//
//    std::cout << datoRecuperado->getNum();
//    std::cout << datoRecuperado->getTexto();
//
//
//    delete datoRecuperado;
//    archivo.close();
//
//}

void pruebaSerializacionDatoCuba()
{
	TipoSerializacion tSerializacion = BINARIO;

	ClaveAlumno clave (88240, tSerializacion);
	ClaveAlumno clave2 (84000, tSerializacion);
	DatoCuba dato(500, clave, tSerializacion);
	DatoCuba datoHidratado(0, clave2, tSerializacion);

	stringstream stream;
	dato.serializar(stream);
	datoHidratado.hidratar(stream);

	if ((datoHidratado.getClaveHasheada() == dato.getClaveHasheada() ) &&
		(datoHidratado.getPosicionBloque() == dato.getPosicionBloque()))
	{
		cout << "DatoCuba se hidrata correctamente \n";
	} else {
		cout << "DatoCuba se hidrata incorrectamente \n";
	}

	ClaveDatoCuba claveDato(dato, tSerializacion );

	stringstream ss;

	claveDato.serializar(ss);
	claveDato.hidratar(ss);

	if (claveDato == dato)
	{
		cout << "claveDatoCuba se hidrata correctamente \n";
	} else {
		cout << "claveDatoCuba se hidrata incorrectamente \n";
	}
}

void pruebaHidratarCuba()
{
	int tamanoBloque = 512;
	TipoSerializacion tSerializacion = BINARIO;

	Cuba cuba(tamanoBloque, tSerializacion);
	cuba.setProfundidad(15);

	ClaveAlumno clave(88240, tSerializacion);
	DatoCuba dato(tamanoBloque, clave, tSerializacion);

	stringstream cubaSerializadaSinDato;
	cuba.serializar(cubaSerializadaSinDato);

	Cuba cubaFea(tamanoBloque, tSerializacion);
	cubaFea.hidratar(cubaSerializadaSinDato, dato);

	if (cuba.getProfundidad() == cubaFea.getProfundidad())
	{
		cout << "Prueba Successfull sin datos \n";
	} else {
		cout << "Prueba Fallida sin datos \n";
	}

	Registro *registro = new Registro(tSerializacion);
	registro->setDato(dato);
	ClaveDatoCuba claveDato(dato, tSerializacion);

	cuba.agregar(registro, claveDato);

	stringstream cubaSerializadaConDato;
	cuba.serializar(cubaSerializadaConDato);

	stringstream stream;
	Archivo archivo(tamanoBloque, "", "almacenamientoCubas.txt", tSerializacion, stream);

	cubaFea.hidratar(cubaSerializadaConDato, dato);

	Registro *registroAux = (Registro*)cuba.buscar(claveDato);
	DatoCuba *datoPrueba  = (DatoCuba*)registroAux->clonarDato();

	if ((cuba.getProfundidad() == cubaFea.getProfundidad()) &&
		 ((datoPrueba->getClaveHasheada()) == (dato.getClaveHasheada()) ))
	{
		cout << "Prueba Successfull con datos \n";
	} else {
		cout << "Prueba Fallida con dato \n";
	}
}

void pruebaSerializarCuba()
{
	unsigned int tamanoBloque = 100;
	TipoSerializacion tSerializacion = BINARIO;

	stringstream stream;
	Archivo archivo(tamanoBloque, "", "ejemplo.txt", tSerializacion, stream);

	Cuba cuba(tamanoBloque, tSerializacion);

	stringstream cubaSerializada;

	cuba.setProfundidad(10);

	cuba.serializar(cubaSerializada);

	archivo.guardarDato(cubaSerializada);
}

#endif /* PRUEBASSERIALIZACION_H_
*/
